約 3,416,348 件
https://w.atwiki.jp/oblivionfaq/pages/18.html
Q:ダウンロードサイトでダウンロードできないよ? A:ココを参照してね。 ※無料でダウンロードできる大手サイトでは、広告が表示されたり、DL可能ボタンが出るまで 時間がかかったりします。 金払わそうと思って(有料プレミア会員になれば高速回線でDLできるモノが多い) こんなマネしやがって~と歯軋りしながらDL開始まで大人しく待ちましょう。 【 MODアップローダTES Nexusの質問 】 Q:TESNでDLした複数(part1~2)のファイルを解凍しようとしたら、エラーが出た。 A:TESNでは、自動的に●▲■_part1-14780.rar、●▲■_part2-14781.rarのように ファイル名に番号が付きます。 ●▲■_part1.rar、●▲■_part2.rarにリネームしてpart1から解凍すれば、 自動的にpart2も含めた1つのファイルとして解凍されます。 【 画像兼MODアップローダGAGAGAの質問 】 Q:jpg→7zってどういうこと? A:リンクを右クリックして“対象を保存します”でダウンロードした.jpgファイルの拡張子を .7zに書き換えて解凍してくれってこと。 拡張子が表示されない人はココを参照 7z形式についてはココを参照。
https://w.atwiki.jp/incubusfantasy/pages/15.html
実装されているMOD ロリエルフ追加MOD 攻めセリフ拡張MOD 肉便器MOD ネタアイテムMOD ロリエルフ追加MOD 製作者:高岡智空さま+公式の合作 高岡智空さまの考案したロリエルフを追加します。 高岡智空さまから セリフ、弱点、外見の特徴などの設定を頂き、 公式がイラストのみを担当させて頂きました。 セリフランダム 特殊攻撃あり 特殊弱点あり 攻めセリフ拡張MOD Ver.1.0.0 製作者:開発室さま 女の子に絞られたいM専用のMODです。 戦闘時のセリフを450種類以上追加します。 450種類という膨大な追加セリフの中から 戦闘時の状況に応じてランダムでセリフが変更されます。 敗北後の搾精モード連射では自然な連射ができ、 とてもクオリティの高いMODです。 敵に攻められる時のセリフを大幅に追加 敵のセリフをランダム化 攻撃の種類とセリフを大幅に追加 衛兵END追加(敗北時) 肉便器MOD Ver.1.0.0 ver1.10 このMODは牢獄部屋と統合されるため廃止予定です。 使用する、を選択すると回想100%になります。 ver1.0.c以前 一部の種類の敵を何度も倒すと、肉便器差分のキャラが出現します。(現在8種類) 追加されるキャラは次の通り ☆肉便器マウス ☆肉便器ゴブリン ☆肉便器衛兵 ☆肉便器プリースト ☆肉便器アルラウネ ☆肉便器アルラウネ青 ☆肉便器スノースライム ☆肉便器スライム ネタ[[アイテム]]MOD Ver.1.0.0 ver1.1.0 ネタアイテムであるぱんつは世界に統合されました。 デフォルトで登場します。 ver1.0.c以前 6種類のかぐわしいぱんつが追加されます。 追加されるアイテムは次の通り ☆エリスのぱんつ ☆かたねこのぱんつ ☆アリスのぱんつ ☆ぱんつ ☆かぐわしいぱんつ ☆にじ コメント欄(*編集が苦手な方はこちらへ訂正指摘などをお願いします) 名前
https://w.atwiki.jp/twwiki/pages/226.html
The Witcher 1のMODとツールの紹介ページです。 MODシステム関連 総合MOD ゲームプレイ関連 グラフィック・サウンド関連 ストーリーMOD(Fan-Made Adventures) リンク その他イントロムービーをスキップする ファイルフォーマット、ファイルの展開方法 ツールD'jinni Adventure Editor The Witcher Enhanced Editor(TWEditor,セーブエディター) MOD 基本的に、MODの保存先はThe Witcherインストール先のData\Override(フォルダがない場合は作成する)。 The Witcherインストール先はSteamの場合は、C \Program Files (x86)\Steam\steamapps\common\The Witcher Enhanced Editionなど。 MODごとにOverrideフォルダ直下にファイルを置かず下層のフォルダに置いても問題なく反映される模様。MODのファイル同士が競合する場合は不明。 Mod Organizer 2で管理すれば、MODの衝突も判明する。その場合は日本語化パッチやProject Merseyのようにフォルダ階層を作らず、1個のMODフォルダに全部入れておく事を推奨(moduleフォルダを除く)。 システム関連 4GB Memory Patchx86実行ファイルに4GBの仮想メモリを使えるようにする定番パッチ。 Fallout 3向けのようにカスタマイズされてはおらず、4GB Patch - NTCoreと同一。 GOG版はパッチ済み。 Project Mersey - The Witcher Fix Packゲームファイル内に隠されているコンテンツの復元、バグの修正をするMOD。 通常アイテムは100個、錬金術の材料は1000個までスタックできるなど、システムにも多少手が入っている modファイルを1個書き換え、会話の復元・修正により一部の日本語化が解除される。 以下の3つのバグ修正MODの併用が強く推奨されている。 Missing Kalkstein and Leuvaarden Clues Fix Han Gives Han NOT Berbercane Morenn Storage and Romance Fix 総合MOD FCRとRotWWは併用可能。 Full Combat Rebalance (FCR)戦闘システムを始めとして様々な変更を行う。インストーラにより様々な機能も有効化できる。 Rise of the White Wolf Enhanced Edition (RotWW)内容インターフェイスの変更 新しいオプション、インベントリー、ジャーナル、その他の画面。 たくさんのキャラクターのテクスチャーの変更。ゲラルドのジャケットの刷新を含む。 新たなウイッチャーのアーマー。 新たなダンディリオンのカットシーン。 新たなスカイボックス。 zip版とexe版があり、exe版ではインストールしたい内容を選択できるようになっている。アンインストーラも導入される。 参考比較スクリーンショットFCRと併用する場合、インストール時は"FCR Compability"のチェックを入れる事。 フォントをインストールすると日本語表示ができなくなるので、インストーラーで「New dialogue fonts」にチェックを入れない事。ZIPからインストールする場合は以下フォルダを削除する事。 Rise of the White Wolf\Data\z_zrotww\fonts\ ゲームプレイ関連 Faster Movement Modゲラルト・敵・NPCの移動スピードが上がる。 ファイルをダウンロード・解凍し、15-25%のうち、好みのスピードの2DAファイル2つをOverrideフォルダに入れる。 初回導入時は別のエリアに移動するか、セーブしてからロードしなおさないと反映されない。 Item Stacking and Equipment Slots Mod同じアイテムを999個まで持てるようにする。クイックスロットボックスに武器を置くことも可能に(一部バグあり)。 baseitems.2daをThe Witcherインストール先のData\Overrideフォルダに入れる。 FCRに同種の機能が含まれている。 Weapons slots unlockedどのスロットにも武器を置けるようにする。 Plentiful Herbs for TW11つのハーブのしげみからより多くのハーブを取れるようにする。 TW1 All Herbs1ヵ所から採れるハーブの量が3-5になるMOD。ページにはハーブの量を変更するための説明もある。 解凍したファイル群をThe Witcherインストール先のData\Overrideフォルダに入れる。 Sex Takes Time Modセックスシーンの後、ピロートーク・場所の移動・時間の経過が発生するようになる。 日本語化MODを導入してる場合、セックスできるNPCの会話文がすべて英語になる。 Leuvaarden Buys Salamandra BadgesDeclan Leuvaardenにサラマンダーのバッジを売れるようにする。 The Witcher Alchemy Mod - Better Color Codingアルケミーの霊薬のアイコンを変更し、マウスオーバーしなくても色で主効果・副効果がわかるバーを追加する。 解凍したファイル群をThe Witcherインストール先のData\Overrideフォルダに入れる。 One-round Dice Poker Mod1ラウンドでダイスポーカーを終えるようするMOD。 .2daファイルをThe Witcherインストール先のData\Overrideフォルダに入れる。 Teleport at will between the Swamp and the Temple Quarter第2章において、沼地(the Swamp)と寺院地区(the Temple Quarter)にテレポートできる巻物を追加する。MODを導入すると、クエストインベントリーに青と赤の巻物が表示される。屋外で読み、インベントリーメニューを閉じるとテレポートされる。 このMODは第2章のみで使用できる。第3章の沼地はゲーム内としては別の場所データとなっているため。 二章以降でクエストインベントリーから消したい場合は、後述のTWEditorを使うこと。 Stop the Rain for TW1クエストインベントリーに追加される黄色い巻物を読み、インベントリーメニューを閉じると雨が止むようにする。 Convenient Shopkeeperクエストインベントリーに緑の巻物が追加され、読んでインベントリーメニューを閉じると役立つアイテムをそろえた商人が出現するMOD。 Convenient版は一般的なアイテムをそろえる。Cheating版は多くのモンスターの部位をそろえ、5倍以上の価格で買い取る。(?,shopkeeper pays 5 times more for items) Many Items複数のアイテムMODをバンドルし選択して使用できるMOD。クエストインベントリーの"Many Items Scroll"を読みインベントリーメニューを閉じると "Corylea" というキャラクターが出現し、その会話メニューで使いたいアイテムMODを選択できる。治療と解毒もしてくれる。 バンドルされているアイテムMODJ_Slash's "Stuff That Makes Geralt's Life Easier" mod(いつでも倉庫にアクセス、いつでも治療、猫の目を切り替え式に) Genie Wish Mod(青の魔人があらわれ、選択したアイテムをくれる) Book of All Knowledge(すべてのモンスターについて記された本、すべての薬草について記された本、爆弾以外のすべての霊薬のレシピが記された本をもらえる。くわしくはリンク参照) No Cemetery Drowners for TW (第5章の沼地でドラウナーなどの低レベルモンスターが出現しないようにする巻物) Teleportation Scrolls (第2章において寺院地区と沼地をテレポートできる巻物。先述) Stop the Rain scroll(雨を止ませる巻物。先述) Convenient Shopkeeper (役立つアイテムをそろえた商人を出現させる巻物。Convenient版とCheating版を選択可能。先述) Stuck Sword Oil Remover Radovid Door Fix for TW1(バグってる場合のみ) 解凍したzz_Many_ItemsフォルダをDataかData\Overrideに置く。 The Doppler's Essence modプレイヤーキャラクターを変更するMOD。159人の人間、17種類のモンスターから好きなものを選べる。 The Witcher Extreme Immersion ModHUDの内容を削り、没入感を高めるMOD。「朝か夜か、戦闘スタイルや使ってる武器、攻撃するタイミングは見てればわかるよね?」という感じ。メダリオン、ステータスバー、バフ、クイックスロット以外のHUD要素の排除。 戦闘時のライフサークル、攻撃タイミングの表示の排除。 インベントリーなどのアイコンも画面上に表示されなくなるため、ショットカットキーを覚えておく必要がある。 グラフィック・サウンド関連 AI Upscale Textures2023年時点で、最も高品質なテクスチャ。 推奨は"AiO AI Textures with RotWW and The Witcher Overhaul Project by lexo1000" "Textures Settings Downgrade Fix"単体は最新版なのでインストール推奨 フォントをインストールすると日本語表示ができなくなるので、以下のフォルダは削除する事。 RotWW\fonts\ The Witcher Overhaul Project建物、インテリア、壁、自然物、空などの環境系と血のテクスチャとシステム、雨、雷などのサウンドの改善。 2023年時点では、AI Upscale Texturesとサウンドオーバーホールを併用するのがほぼベスト Hiuuz's Witcher 3 Faces for The WitcherThe Witcher IIIのような顔に変更するMOD。 Scabbard Mod剣の鞘を追加するMOD。剣の3Dモデルも変更する。 exeファイルを開くインストーラ形式。他のMODとの互換性を重視して、インストールは「The Witcher EE with FCR mod」を選択 日本語化MODを導入してる場合、剣や防具の名前と説明が英語になる。 Complete Sword Overhaulすべての鋼鉄と銀の剣を新しい高品質モデルに置き換える。 Dagger Overhaulすべてのダガーを新しい高品質モデルに置き換える。 The Witcher Hi-Res Character ModelsほとんどのNPC、モンスター、動物のテクスチャの改善。 The Witcher Texturenオブジェクト、建物、壁、動物、ミニマップ、地形、アーマー、魔法やその他のエフェクト、地面のテクスチャの改善。 The Witcher Perfect Blood血の表現の改善。傷の表現の改善を含む。 The Witcher Perfect Blood - Fix 修正パッチ。 The Witcher Overhaul Projectのほうがオススメ Perfect Rain Mod雨の表現をより自然にする。 Dontforceminreqs Low Res Texture Fix強制的に最も高いテクスチャの設定にする。 参考 -The Witcher Enhanced Edition -How to Min system requirements not met (ErrorFix) + -dontForceMinReqs low texture lock FIX MinHudModHUDから不必要な装飾を除くMOD。 The Witcher Black Edition mod - Mod DBUIを黒を基調としたものに変更するMOD。 The Witcher Inferno Edition mod - Mod DBUIをインフェルノなデザインに変更するMOD。 参考 Improving Witcher EE VIsuals ストーリーMOD(Fan-Made Adventures) The Weird World of the Witcher mod And a Curse, and Love, and Betrayal mod for The Witcher Entrapped aka W potrzasku mod for The Witcher The Crossroads mod for The Witcher Right to the Throne mod for The Witcher Birth, Virgins mod for The Witcher Deception mod for The Witcher Medical Problems mod for The Witcher Merry Witchmas mod for The Witcher The Wedding mod for The Witcher Valentine's Day Wishes mod for The Witcher Deceits mod for The Witcher 参考 [TW1] Reviews of all Fan-Made Adventures https //forums.cdprojektred.com/threads/25995-TW1-Reviews-of-all-Fan-Made-Adventures リンク Category Modding - Witcher Wiki - Wikia Let's mod The Witcher Enhanced Edition Recommended mods and adventures (gog.com) The Witcher Enhanced Edition - Revised Modding Guide (reddit.com) MOD配信サイト The Witcher NexusThe Witcher Colletions Mods - The Witcher - Mod DB その他 Category Mini-mods - Witcher Wiki - Wikia Full controller support360コントローラに対応させるためのガイド。 Bigger Textゲーム中のテキストを大きくする。 イントロムービーをスキップする Intro mod - Witcher Wiki - Wikia イントロ/アウトロムービーは以下のスクリプトで管理されている \DATA\SCRIPTS\MOVIES.LUA もし \DATA\SCRIPTS\MOVIES.LUC しかない場合はコンパイルされているので、デコンパイルが必要。→LUC format - Witcher Wiki - Wikia MOVIES.LUA をテキストエディターで開くと、以下の行を見つけられる。 local Intro = {"cs_publisher", "cs_developer", "cs_engine", "CS_BLOCKEND", "cs_intro", "CS_BLOCKEND", "cs_title"} 以下のように書き換えるとイントロムービーをスキップし、タイトル画面に遷移するようにできる。 local Intro = {"CS_BLOCKEND"} 書き換えたMOVIES.LUAを\DATA\OVERRIDEに保存する(OVERRIDEフォルダがない場合は、作成する)。 それでもダメだった場合は、元のMOVIES.LUAはバックアップしておいて、書き換えたMOVIES.LUAを\DATA\SCRIPTSに置く。 ファイルフォーマット、ファイルの展開方法 Game layout File formatCategory File Formats Extracting the original files The Witcher models ツール D'jinni Adventure Editor メーカー公式のストーリーエディター。The Witcher Enhanced Editionから同梱。 D'jinni Adventure Editor - Witcher Wiki - Wikia Djinni Wiki - Wikia The Witcher Enhanced Editor(TWEditor,セーブエディター) チートだけでなく、バグ回避やMODをアンインストールしたのにクエストアイテムのスロットにアイテムが残って消えないなどの時にも使える。 The Witcher (Ron's Work Space)(アーカイブ) ダウンロード(ミラー) Save editor - Witcher Wiki - Wikia SAVEGAME EDITING Solving quest related bugs altering gameplay experience 準備 使用にはjavaが必要。 TWEditorのzipファイルを解凍すると、jarファイルとショットカットが存在する。 ショートカットはそのままでは使用できないので、調整しなければならない。 ショートカットを右クリックでプロパティを選択し開いたリンク先の入力欄を %windir%\system32\javaw.exe -Xmx256m -DTW.install.path="Witcherのインストール先" -DTW.language=3 -jar TWEditor.jar として、OKを押して閉じる。 たとえばSteamの場合は、 %windir%\system32\javaw.exe -Xmx256m -DTW.install.path="C \Program Files (x86)\Steam\SteamApps\common\The Witcher Enhanced Edition" -DTW.language=3 -jar TWEditor.jar となる。 ショートカットを開いてもjavaw.exeが見つからないと出る場合は、直接ディレクトリを指定するのが手っ取り早い。 "C \Program Files (x86)\Java\jre1.8.0_31\bin\javaw.exe" -Xmx256m -DTW.install.path="C \Program Files (x86)\Steam\SteamApps\common\The Witcher Enhanced Edition" -DTW.language=3 -jar TWEditor.jar などとする。 今後はこのショートカットからTWEditorを起動する。
https://w.atwiki.jp/oblivion1/pages/65.html
#freeze #nofollow #norelated プラグインマニュアル プラグインマニュアル [#v0ed77c7] プラグインマニュアルの凡例 [#vf3c6f93] E-G E [#q45dc325] edit [#i1e8d3e8] F [#n4aa1621] filelist [#zfddbc2e] freeze [#le1aaa47] L-N L [#o648e077] lastmod [#icd62a6b] links [#m5bbd018] list [#l9a47a57] lookup [#u9c3d366] ls [#b596a628] ls2 [#d2ce34ea] M [#cdfaaa0f] map [#i89f687e] md5 [#wec9aa1f] memo [#h2cba975] menu [#vc24ce14] N [#ge4daaa6] navi [#yd9441b2] new [#meab71a6] newpage [#lec55a94] nofollow [#s8c0fa4c] norelated [#uebd3c7c] O-R O [#c4c5830a] online [#vc9c6801] P [#eb773236] paint [#v8e0f909] pcomment [#n889950d] popular [#aa6d5e99] R [#heb39161] random [#bdab4a5d] read [#qd5d7395] recent [#f6f25416] ref [#h9e797dc] referer [#l8d62a01] related [#v4da5475] rename [#m95d6531] rss [#iaac8b70] rss10 [#v879eb4d] ruby [#u3fad1fe] S-U S [#mee1bd43] search [#ba94ddfd] server [#d69aa1d0] setlinebreak [#va79297e] showrss [#v7316017] size [#e5db48c0] source [#k23d3e24] stationary [#ifad4486] T [#u58dc027] tb [#s5056787] template [#j2adfc3d] topicpath [#vd55c067] touchgraph [#p93402bd] tracker [#rf5296e2] tracker_list [#t78d6d0a] U [#q0183edd] unfreeze [#v039be15] update_entities [#r62603ec] V-Z V [#be6c635c] version [#v924021a] versionlist [#n3c07f6b] vote [#aa4fb1f8] Y [#kb2afc33] yetlist [#v5902d84] プラグインマニュアルの凡例 プラグインマニュアルは以下の形式で記述されています。 プラグイン名 種別 プラグインがどのような方法で呼び出しを行えるかを示します。複数の呼び出し方法をもつプラグインも存在します。 コマンド − コマンド形式の呼び出しが可能であることを示します。内部的に呼び出されるため、説明を省いている場合はカッコで括られています。 ブロック型プラグイン − ブロック型プラグインでの呼び出しが可能である事を示します。 インライン型プラグイン − インライン型プラグインでの呼び出しが可能である事を示します。 擬似ブロック型プラグイン − PukiWiki本体で実現されている機能であることを示します。記述方式がブロック型プラグインと同じであるため、便宜上プラグインのマニュアルに含めています。 重要度 そのプラグインの一般的な利用頻度や有用性の目安を示します。さほど重要でない場合は ★☆☆☆☆ が、重要なプラグインの場合は ★★★★★ です。 書式 プラグインでの引数指定方法です。引数の指定方法の表現のため、下記の記述書式を使っています。 [] − 省略可能で必要に応じて記述する箇所です。 | − |で区切られた複数の項目のうち、指定できるのは1つである事を示します。 {} − 中カッコ内のみ引数の指定順序が任意である事を示します。 概要 そのプラグインの機能概要です。 引数 引数の詳細な説明です。 プラグイン内設定 プラグインのソース中で定義されている定数の一覧です。引数で変更できない詳細なカスタマイズが可能となります。 備考 プラグインに関する参考情報です。
https://w.atwiki.jp/oblivionfaq/pages/20.html
Q:どのMOD入れたら公開されてるSSみたいなの撮れるの? A:あくまで一例ですが↓参照 http //www12.atwiki.jp/ssmod/pages/39.html http //www12.atwiki.jp/ssmod/pages/33.html Q:敵を高画質にしたいんだけど A:Dalls CreaturesMODを導入しましょう。 ゾンビ高画質化はbeautiful zombieから。
https://w.atwiki.jp/besiegejpwiki/pages/32.html
MODとは Modとは、主にパソコンゲーム用の改造データのこと。 besiegeではV0.70アップデートにより公式にMOD導入がサポートされ、ワークショップからDLすることで様々な機能をbesiegeに追加できる。 目次 主要MODリスト制作支援系mod ブロック追加系mod 環境改変系mod オブジェクト追加系mod その他 ディスコード配布MODの導入方法 MOD制作 主要MODリスト 制作支援系mod 有益な情報を表示したり、ビルド時の機能を追加したりすることで、マシン制作を手助けするmod。基本的にこれらのmodを使って建造した機体はバニラ環境で動かすことができる。 名前(リンク) 概要 使用・導入方法 NoBounds MOD 数値入力でブロックのパラメータを設定する際、上限を撤廃する。通称「限界突破」「限凸」 入れるだけで使用可能 Easy Scale MOD パーツパラメータ欄にサイズ変更の機能を追加する。Besiegeでトップクラスで人気があり、HardScaleMODと共に使われる事が多かった。現在はサポート終了し、作者がBSTを使うことを推奨している。 入れるだけで使用可能 Block Scaling Tools ブロックの位置・角度・スケールを数値で変更できる。略称BSTサーフェスの設定で厚みを変えられるようになる。EasyScale、HardScale、一部のBraceCubeMODの機能を内包しているため、最近はこのMODが主流EasyScaleMODと競合することに注意。 前提MODとして、UIFactoryとColliderScopeが必要。 Additive Loading 別のマシンを現在のマシンに追加する形で呼び出せるMOD 入れるだけで使用可能 Colliderscope ブロックの当たり判定や接続判定を表示するMOD通称「新コライダーmod」旧コライダーmodよりも判定が細分化されている 将来的にUIFactoryの必須化と大幅な仕様変更が予定されている。 Collider Mod マシンの当たり判定を表示するMOD通称「旧コライダーmod」現在はサポートが終了し、制作者がColliderScopeを使用することを推奨している 入れるだけで使用可能 Burning Trigger Mod ブロックの燃焼判定を表示する 入れるだけで使用可能 More Paint Bucket スキン設定タグのスキン表示数を増やし、検索機能を追加するMod 前提MODとして、UIFactoryが必要。 More AutoSave マシンのバックアップを取ってくれるmodDagriefaa氏によるAuto Saveの後継mod 入れるだけで使用可能セーブは自動で行われる Auto Save マシンのバックアップを取ってくれるmod現在は後継modが開発され、まもなくサポートが終了すると思われる為、非推奨 入れるだけで使用可能セーブは自動で行われる Aircraft Build Support マシン作成をサポートする多くの機能を追加するMod。略称ABS空力中心軸とより正確な重心を表示する似通った機能を持つブロック同士を交換する頭接続のあるブロックを頭側から設置できるようにする空気抵抗ベクトルを可視化するTGYHキーでプロペラ角度を変更するGキーで短縮可能なブロックの長さを変更する任意のpngファイルを表示するエンティティを追加する 入れるだけで使用可能より詳しい解説はこちら→ABS機能解説 解析MOD 座標計・速度計・加速度計・HP等の種々のステータスを表示可能。また、それらのパラメータを外部ファイルに保存もできるため実験・解析に有用。日本語対応。再生速度の微調整やUIの更新レート変更など、細かい需要に対応したMOD。 入れるだけで使用可能コアブロックから詳細設定 DefaultSettingMOD ブロックのデフォルト設定を変更できる。詳細はワークショップ解説欄。 入れるだけで使用可能 Keybind Mod Unityで入力可能な約300のキーを、マシンの入力やエミュレートに設定できるようになる 入れるだけで使用可能 Instrumentality 使用ブロック数や重量などのマシンの情報や速度などのシミュレーション中の情報などを表示するMOD下記のSpeedometerと同時に使用すると表示が被るので注意 前提MODとして、UIFactoryが必要。 Speedometer マシンの速度を表示するMODシンプルで邪魔にならないUIなのが特徴上記のInstrumentalityと同時に使用すると表示が被るので注意2023年1月現在 Besiege v1.2.0アップデートの影響で破損している。修正される見通しも無いため、InstrumentalityやABSを使うこと推奨。 入れるだけで使用可能 Better Block Tooltips ブロック選択画面でカーソルをあわせると表示される説明をより良くするMod重量や摩擦係数、接続強度や属性など多くの情報を提供する 前提MODとして、UIFactoryが必要。 + ColliderscopeのUIの見方 ColliderscopeのUIの見方 項目 説明 IN SIM シミュレーション中でもコライダーを可視化する X RAY スキンを投下してコライダーを表示する C SOLID 被接続判定があるコライダー N SOLID 被接続判定が無いただの当たり判定のコライダー ADD PT 被接続判定たいていはN SOLID表面にある FIRST 根元接続 SECOND 頭接続 MECHAN 可動な関節部分にある根元接続(ヒンジやホイールの根元など) STICKY ブレースの終端やサーフェスの接続判定など ENV グラバーの吸着判定やバキュームの吸引判定、センサーの検知判定など OCCLUDE プロペラやウッドポールなどの根元にある四角い判定ブロック選択のミス対策のための判定で、実用上の意味はない ブロック追加系mod 様々なブロックを追加するmod。modによる追加ブロックはmodが無い状態では消失することに注意。 また、バレンエクスパンスなどのフィールドに入った状態でこれらのブロック追加系modを新たにロードした場合は、Besiege内部でmodブロックの順番が入れ替わり、置きたいブロックとは別のブロックが置かれる不具合がある。その状態でセーブするとブロックは入れ替わったままになる。 そのため、プレイ途中でmodブロックを使いたくなった場合は、これらのmodをオンにした状態で再起動することを推奨する。 名前 概要 使用・導入方法 Bullet Module Mod製の大砲系ブロックの弾を貫通しないようにするMod。通称「たまmod」現在はACMに弾丸が貫通しない機能が統合された。弾丸の大きさを変える等の機能もある。 入れるだけで使用可能 Battle Bullet 機銃系modの一種通称「スケピン砲」現在は後継modのBB2が使われる事が殆どである。 入れるだけで使用可能 Simple Machinegun 機銃系modの一種通称「オトカム砲」 入れるだけで使用可能 Battle Bullet ver2 機銃系modの一種通称「(新)スケピン砲」、「光弾mod」、「BB2」 ACMを同時にロードする必要がある Battle Missile ミサイル系modの一種通称「無誘導ミサイル」誘導ミサイルよりも威力とスピードがある ACMを同時にロードする必要がある GMissile(Guided Missile) ミサイル系modの一種で、ロックオンにより敵のスターティングブロックを追尾する通称「誘導ミサイル」数種類のミサイルブロックと、防御用のチャフが追加されるACMにより追加されるHUDの中央に敵機をとらえ続けることでロックオンできる ACMを同時にロードする必要がある imageプラグインエラー 画像を取得できませんでした。しばらく時間を置いてから再度お試しください。E'sTankCannonsMod EEX制作の戦車砲mod 通称「E砲」または「恵方」 多数の戦車系の陸上武装を追加する。(何故か誘導ミサイル等も)一部から人気が高いためE砲を使ったレギュレーション戦は多い。 ACMを同時にロードする必要がある NavalGunMOD ACMを使用した武装追加MOD通称「艦砲」艦船に使えそうな武装を色々追加する もはや艦でも砲でも無いものも絶賛調整中 ACMを同時にロードする必要がある Laser Weapons レーザー機銃とホーミングレーザーを追加する通称「レーザー」 ACMを同時にロードする必要がある Useful Parts ダンパなど、バニラにはない様々なブロックを追加するmod ACMを同時にロードする必要がある SmokeTrailMod 飛行機雲のようなスモークを追加する5色x2タイプの10種類,おまけでスモークグレネードも ACMを同時にロードする必要がある Analog Controllable Blocks アナログスティックで操作することができるブロックを追加する ACMを同時にロードする必要がある BoosterAndFuelMod 燃料を供給するインテークと燃料を貯蔵するタンク、燃料を消費して推進力を発生させるブースターを追加する ACMを同時にロードする必要がある BattleDrone 遠隔攻撃が可能なドローン兵器を追加する ACMを同時にロードする必要がある ShipBlocksMod 当たり判定全体が被接続判定を持つ板状・棒状のブロックを多数追加する 入れるだけで使用可能 Monitor Mod 独自のカメラブロックを追加し、カメラで取得した画像を鉄製プレートやサーフェスに表示する 入れるだけで使用可能 First Person Controller WASDキーで操作可能なアバターを追加するボタンや座席等のインタラクションブロックにより、他人のマシンを操作できるようになる Controller Blockを設置し、起動キーを押すとFPSモードになる 環境改変系mod 既存の仕様を変更するmod。こちらもmod無しでは機能が働かないことに注意。 名前(リンク) 概要 使用・導入方法 とねりこの海Mod Besiege世界に海を出現させる。各ブロックに浮力を追加し、船などを浮かばせることができる。バラストに重量変更機能を追加する。このmodを利用した船舶や水上機による対戦レギュレーションも存在する。現在はサポート終了しているため、ACMの海機能を使うことも多い。 入れるだけで使用可能 Stabilizer Mod スターティングブロックの姿勢と空気抵抗を制御することができるMod 入れるだけで使用可能 Reinforce connection ブロックの接続強度を個別に設定可能にするMod。 入れるだけで使用可能 Cruiser Mod 船の素材用ブロックを追加するMod。通称「ふねmod」どの強さの大砲でも反動が1倍相当に減少するクロスボウの矢が燃える機能を追加する 入れるだけで使用可能 Hidden Name Plate Mod マルチプレイ時のプレイヤー表示が地形などに隠れるようになるmod 入れるだけで使用可能 Lua Scripting Mod マシンにlua言語によるプログラムを適用できるようになるmodスクリプトはbsgファイル内に保存される 入れるだけで使用可能 Universe Mod 宇宙風の環境を追加する重力制御用レベルエディタオブジェクト反重力ブロックスカイボックスの変更など 入れるだけで使用可能詳細はリンク先を参照 Lock On Mod HUDを起動することで他プレイヤーをロックオンするmodロックオン時には射撃系ブロックが自動で偏差撃ちするようになる 入れるだけで使用可能 Besoig++ リアルな現代戦闘を再現するmod詳細な設定が可能な武装ブロックの追加や特有の被弾プロセスの追加が行われる オブジェクト追加系mod レベルエディタで使用できるオブジェクトを追加するmod。modによる追加オブジェクトはmodが無い状態では消失することに注意。 名前(リンク) 概要 使用・導入方法 City Objects 現代風の市街のエンティティを追加するMod 入れるだけで使用可能 Desturcive Cubes Mod 破壊可能なキューブ状エンティティを追加するMod 入れるだけで使用可能 Enhance Entity 以下のロジックを追加するmod・子オブジェクト化・スケール変更なお、modをロードしていない状態では、当該ロジックに関わるすべてのオブジェクトが消失することに注意 入れるだけで使用可能 Chat Event トリガーから実行されるチャットイベントを追加する指定した文字がチャットウィンドウに出力される リンク先を参照 Stopwatch Event トリガーから実行されるストップウォッチイベントを追加する リンク先を参照 その他 名前(リンク) 概要 使用・導入方法 besiege Custom scene MOD ステージのベース地形を砂漠や山岳など、さまざまに変更する。付随して、ワールドの壁の無効化、速度計の表示など、充実した機能のMOD 入れるだけで使用可能 Add Custom Module Mod Xml記述で使用できるCustomModuleを追加するMod。略称ACM空のテクスチャを変更したり、浮力のある海を追加したりするオプションを追加する(ctrl+U)一部のModブロックを運用する際に必須スターティングブロックにHUDを表示するキーが追加され、これを押すことでHUDが出現する 入れるだけで使用可能→ACMmod解説 UI Factory BesiegeMod制作者向けにUIフレームワークとエディターを提供するModObjectExplorerと併用する事でゲーム内でUI制作が可能となるDagriefaa氏制作のModを始めとした一部Modで、前提Modとして要求される 入れるだけで使用可能 Flight Instruments Mod シミュレーション中画面に航空計器を表示するModマシンの進行方向を予め設定する必要がある 入れるだけで使用可能 RC-Camera カメラを固定し、ホイールクリックしたブロック等にカメラ角度を追従させられるmodラジコンでマシンを操作するかのような感覚でプレイできるようになる 入れるだけで使用可能 Replay Mod マシンのキー操作を記録し、再生することが可能になるmod詳細はワークショップの概要欄へ 入れるだけで使用可能 Object Explorer あらゆるオブジェクトやコンポーネントの様子を表示し、トグルや値の書き換えを行うことができるmodmodを自作する際に非常に役立つ 入れるだけで使用可能 Jump Command 任意の座標にカメラを移動するコマンドを追加するJumpCommandMod解説に使い方を記載。 入れるだけで使用可能 Pチェッカー ルールを守って楽しくぱんころ! 入れるだけで使用可能 Translate Preset 移動距離と回転角度のセットを保存・復元するショートカットを追加する 入れるだけで使用可能 ディスコード配布MODの導入方法 ディスコードではMOD開発者により、直接MODファイルが提供されることがある。 この場合配布されたファイル(zip圧縮されている場合が多い)の「○○○○○○○_Project」フォルダごと C \Program Files (x86)\Steam\steamapps\common\Besiege\Besiege_Data\Mods に解凍することでMODを使用することができる。 ディスコードで配布されるMODは開発中のデバッグを兼ねていることが多く 利用については自己責任、二次配布や動画仕様については開発者に可否を確認すること。 + 旧MOD解説・導入方法 V0.6アップデートにより、それまで主流であったspaar's Mod Loaderの使用が不可能になり、新たにUnityPluginManager(以下UPM)を用いたMOD導入が行われるようになっている。この項目ではUPMを用いたMOD導入方法について解説する. MOD使用は自己責任で行なうこと。 UnityPluginManager導入 まずは以下から「UPM v1.0 」をダウンロード https //github.com/UnityPluginManager/PluginManager/releases ※クリックで拡大 ZIP内には以下の3ファイルが入っている。 Mono.Cecil.dll PluginManager.dll PluginManager.Installer.exe 上記の3ファイルを+「besiege」フォルダ※内に解凍 「besiege」フォルダ内に手動で「Plugins」フォルダを作成 「PluginManager.Installer.exe」に「besiege.exe」をドラッグ&ドロップ ※「besiege」フォルダのパスは〔C \Program Files (x86)\Steam\steamapps\common\Besiege〕 ※クリックで拡大 以上で下準備は終了。簡単なMODであれば、「besiege」フォルダ内に作成した「Plugins」フォルダ(C \Program Files (x86)\Steam\steamapps\common\Besiege\Plugins)に.dllファイルを入れればそれだけで動作するようになる。以下に代表的なMODを記載するので、特殊なインストール方法のものは個別に解説する。 MODリスト 名前 概要 リンク 使用・導入方法 DiscountNoBounds MOD 数値入力でブロックのパラメータを設定する際、上限を撤廃する。通称「限界突破」「限凸」 リンク 入れるだけで使用可能 DiscountCollider MOD ブロックの当たり判定、接着判定、炎上判定を画面上に表示する リンク 入れるだけで使用可能 DiscountPostPlace 数値入力でパーツの角度を変更できる他、パーツの重量やDRAG(抵抗)を変更できる…が、パーツ角度変更は公式に実装されたうえ、DRAGの変更も保存して読み込みなおすと戻ってしまうので使い勝手は微妙 リンク リンクMODLOADER版の説明だが差異はない Easy Scale MOD パーツパラメータ欄にサイズ変更の機能を追加する リンク※Download for Multiverse と書いてある方をDL 入れるだけで使用可能 besiege Custom scene MOD ステージのベース地形を砂漠や山岳など、さまざまに変更する。付随して、ワールドの壁の無効化、速度計の表示など、充実した機能のMOD リンク 導入方法 MOD制作 MOD制作については公式が公開している情報があるので以下のリンクを参照。 本格的なものはプログラミングの知識が必要だが、ブロックやレベルオブジェクトの追加程度の簡易なものは、用意されているモジュールを使用することで(比較的)簡単に制作することができる。 より具体的な制作方法についてはMOD制作チュートリアルを読んでほしい。
https://w.atwiki.jp/potyolove3/pages/54.html
サーバーMOD Dynmap ウェブ上マップ表示MOD クライアントMOD CodeChickenCore NotEnoughItems[NEI]前提MOD CraftingEX 重複したレシピを選んでクラフトできるMOD fastcraft 軽量化MOD IntelliInput 日本語入力MOD InventoryTweaks 持ち物整理MOD neiaddons NotEnoughItems[NEI]の対応MOD増加MOD NEIIntegration NotEnoughItems[NEI]の対応MOD増加MOD NotEnoughItems[NEI] レシピ観覧MOD OptiFine 軽量化MOD ReiMinimap 地図MOD SpawnChecker 湧き範囲表示MOD Waila NotEnoughItems[NEI]の対応MOD増加MOD 通常MOD CustomNPCs 管理用NPCEditMOD CustomStuff2 管理用アイテムEditMOD js CustomStuff2前提MOD Mantle TConstruct前提MOD MrCrayfishFurnitureMod 家具MOD TConstruct ツール等追加MOD
https://w.atwiki.jp/pinni-uo/pages/40.html
Pinnihilation使用可能なModの一覧です。 使用可能なMod以外の使用は、Ban対象となりますのでご注意願います。 使用可能Mod MinecraftForge|前提Mod ForgeModLoader|前提Mod LiteLoader|前提Mod OptiFine|軽量化Mod IntelliInput|日本語導入Mod MAtmos|リアルなサウンドの追加 StatusEffectHUD|ステータス確認 GammaBright|画面調整Mod ToggleSneak|スニーク切替 CraftGuide|レシピ確認 ShadersMod|影Mod
https://w.atwiki.jp/bannerlord/pages/92.html
基本事項用語 実装パターン レイヤー追加パターンの実装例Example UI Opponent Health Bar 基本事項 用語 Gauntlet UI Bannerlord のユーザーインターフェースに用いられているフレームワークです。 Model-View-ViewModel アーキテクチャー Gauntlet UI は Model-View-ViewModel (MVVM) と呼ばれるアーキテクチャーパターンを採用しています。要は、ゲームの領域、UI の領域、その2つを仲介する領域、の3層に分離させることで、情報を整理しやすく、また分業しやすくするという発想のようです。UI の MOD の場合、実装が必要なのはこの内の View と ViewModel になります。 この辺は、WPF や XAML を触ったことのある方ならお馴染みなのかもしれませんが、そうでない方も、あまり深く考えずに概念として何となく把握していれば大丈夫です。 ウィジェット GUI を構成する部品です。TaleWorlds.GauntletUI や TaleWorlds.MountAndBlade.GauntletUI.Widgets あたりに一通り揃っています。基本的にはこれらで事足りるので、自分でウィジェットを定義するということはあまり無いのではないかと思われます。 Prefab GUI のレイアウトを定義する XML ファイルです。プレハブ建築のプレハブと同じで、出来合いの部品 (ウィジェットや他の Prefab) をどういう風に組み合わせて配置するかを指定し、なにがしかの UI 機能を提供する大きめの部品として独立させたものです。 Prefab は TaleWorlds.Engine.GauntletUI.GauntletLayer.LoadMovie() するたびに読み込まれるので、ゲーム起動中にレイアウトを確認しながら編集していくなんてこともできます。(もちろん、構文エラー等があればその時点でクラッシュしますが) Brush GUI のスタイルを定義する XML ファイルです。Prefab と Brush の関係は、HTML と CSS の関係と似たようなものだそうです。 Widget に複数の状態が定義されていれば、それぞれの状態に応じたスプライト画像やフォント等を Brush に持たせることで、Widget に視覚的変化を与えることができます。例えば、Wiget がデフォルト状態にある時のスプライト、マウスオーバー時のスプライト、クリックした時のスプライト、Disable 時のスプライトなどをまとめられる、と言えばわかりやすいでしょうか。 ブラシは、Native 等の公式モジュールの GUI\Brushes に多数定義されています。 実装パターン 一部のパターンでしか実験していません。「たぶんこういうことだろう」レベルの推測が混じっています。 追加 既存の UI スクリーンにレイヤーを追加し、そこに自前の GUI を描画する (AddLayer)。 標準的な方法です。自分で View も ViewModel も用意するので好きなようにデザインできますが、既存の GUI そのものを書き換えることはできません。 モジュールとしての競合は起こりませんが、意図せず他の MOD の GUI と表示位置がかぶってしまうことはあり得ます。 改変 (未検証) 既存の UI スクリーンのレイアウトだけを変更する (XML 改変)。 使用するデータソース (ViewModel) はそのままで、XML の書き換えによって GUI の配置なんかを変える方法です。簡単だと思いますが、おそらくやれることは限定的です。また、MOD の競合が発生しうる方法だと思われます。 上書き (未検証) 既存の UI スクリーン全体をオーバーライドする (OverrideView)。 上書きする UI スクリーンが提供していた機能を自分で実装することになるため難易度は高いでしょう。また、MOD の競合が発生しうる方法だと思われます。 新規作成 自前の UI スクリーンを作成し、何かのイベントに伴ってそのスクリーンを呼び出す (PushScreen)。 Push/Pop のスタック形式なのでモーダルなポップアップとかに向いていると思います。 一部改変 たとえばオプション項目の追加などがこれに当たりますが、現状ではできないようです。 ただ、可能にする方法は検討されているとのこと。 Beyond that, we continue to work on Adding support for adding options to the options screen レイヤー追加パターンの実装例 Example UI ExampleUI プロジェクトSubModule.cs ViewsSampleMapView.cs SampleMissionView.cs ViewModelsTestWindowVM.cs ExampleUI.Window.xml View と ViewModel の関係がはっきりするように階層 (名前空間) を分けています。 ExampleUI.Window.xml は、 [Bannerlord インストールフォルダー]\Modules\ExampleUI\GUI\Prefabs フォルダーを作成し、その中に保存します。 MVVM では疎結合 (各層の結びつきが緩やか) なのが望ましいとされているそうなので、参照はできるだけ一方向になるようにしましょう。 すなわち、 View が ViewModel のインスタンスを持ち、その逆方向のアクセスはしない Model (ゲーム内の要素) に属するデータの加工は View の中では行わず、ViewModel で行う という感じです。 コード +SubModule.cs モジュールのエントリーポイントです。 using ExampleUI.Views;using SandBox.View.Map;using System;using TaleWorlds.Core;using TaleWorlds.Engine.Screens;using TaleWorlds.MountAndBlade;using TaleWorlds.MountAndBlade.View.Missions;using TaleWorlds.MountAndBlade.View.Screen; namespace ExampleUI{ public class SubModule MBSubModuleBase { private MissionView _missionView; private MapView _mapView; // Mission (平たく言えば、キャラクターが動き回ったり攻撃したりできる状況) に対する // MOD の処理 (ビヘイビアー) の登録はこのメソッドで行います。 // OnBeforeMissionBehaviourInitialize() と OnMissionBehaviourInitialize() の違いは // MissionBehaviour.OnBehaviourInitialize() の前に呼ばれるか後によばれるかです。 public override void OnBeforeMissionBehaviourInitialize(Mission mission) { base.OnBeforeMissionBehaviourInitialize(mission); // ViewCreatorManager.CreateMissionView() は一応ファクトリーメソッドっぽいのですが、 // 公式のコードには、これを介さず単に new MissionView() しているものもあったりして // よく分かりません。どっちにしろ動くのは動きます。 _missionView = ViewCreatorManager.CreateMissionView SampleMissionView (false, mission, Array.Empty object ()); mission.AddMissionBehaviour(_missionView); /* mission.AddMissionBehaviour(_missionView = new SampleMissionView()); */ // このサンプルでは、全ての Mission でテスト GUI が表示されてしまいますが、 // 戦闘シーンだけに表示したいなどといった場合、何らかの工夫が必要になるでしょう。 // // ちなみに、OnBeforeMissionBehaviourInitialize() 時点で mission.Mode は MissionMode.StartUp 固定なので、 // 以下の方法は使えませんでした。 /* if (mission.Mode == MissionMode.Battle) { _missionView = ViewCreatorManager.CreateMissionView SampleMissionView (false, mission, Array.Empty object ()); mission.AddMissionBehaviour(_missionView); } */ } // MapScreen (ワールドマップの描画スクリーン) には OnBeforeMissionBehaviourInitialize() に相当する // メソッドが用意されていないので、スクリーンの Push/Pop イベントを利用してレイヤーを挿入しています。 public override void OnGameInitializationFinished(Game game) { base.OnGameInitializationFinished(game); ScreenManager.OnPushScreen += OnScreenManagerPushScreen; // Obsolete /* ScreenManager.OnPopScreen += OnScreenManagerPopScreen; */ } public override void OnGameEnd(Game game) { ScreenManager.OnPushScreen -= OnScreenManagerPushScreen; // Obsolete /* ScreenManager.OnPopScreen -= OnScreenManagerPopScreen; */ base.OnGameEnd(game); } private void OnScreenManagerPushScreen(ScreenBase pushedScreen) { if (pushedScreen is MapScreen mapScreen) { _mapView = mapScreen.AddMapView SampleMapView (Array.Empty object ()); } /* else if (pushedScreen is MissionScreen missionScreen missionScreen.Mission != null) { // MissionScreen は、まず空の MissionScreen を Push してから、ローディング画面を // 表示しつつスクリーンを初期化していく感じなので、MapScreen と同じ手法は使えません。 // // この時点で missionScreen.Mission には中身がないので、CreateMissionView() は失敗します。 _missionView = ViewCreatorManager.CreateMissionView SampleMissionView (false, missionScreen.Mission, Array.Empty object ()); missionScreen.AddMissionView(_missionView); } */ } [Obsolete("1.6.0より前の手法")] private void OnScreenManagerPopScreen(ScreenBase poppedScreen) { if (_mapView != null poppedScreen is MapScreen mapScreen) { // 1.6.0 からは MapScreen が破棄される際に勝手に MapView.OnFinalize() を呼んでくれるようになったので // MapView と MapScreen の寿命を同じにする限りでは、MapScreen.RemoveMapView() をする必要がなくなりました。 mapScreen.RemoveMapView(_mapView); _mapView = null; } else if (_missionView != null poppedScreen is MissionScreen) { // MissionView については、MissionScreen.OnEndMission() が OnMissionScreenFinalize() の呼び出しから // RemoveMissionBehaviour() まで勝手にやってくれます。 _missionView = null; } // したがって、_mapView と _missionView はもはや必要のないフィールドなのですが、説明用に残してあります。 } }} +SampleMapView.cs using ExampleUI.ViewModels;using SandBox.View.Map;using TaleWorlds.Engine.GauntletUI;using TaleWorlds.GauntletUI.Data;using TaleWorlds.InputSystem;using TaleWorlds.Library; namespace ExampleUI.Views{ public class SampleMapView MapView { private TestWindowVM _dataSource; private GauntletLayer _gauntletLayer; private IGauntletMovie _gauntletMovie; protected override void CreateLayout() { base.CreateLayout(); _dataSource = new TestWindowVM(); // localOrder (レイヤーの優先度) が小さいほど、他のレイヤーより下 (画面奥) に描画されます。 // // 例えば、部隊が町などに入った際に左に表示されるメニュー (GauntletMenuBase) のレイヤー優先度は 100 なので、 // それより小さい値に設定すればテストウィンドウがメニューの下に表示されるようになります。 // ESC メニュー (GauntletMapEscapeMenu) のレイヤー優先度が 4400 なので、これよりは小さい値に // した方がよさそうです。あるいは、ESC メニュー表示中は GUI を非表示にする処理を追加しましょう。 _gauntletLayer = new GauntletLayer(4000); Layer = _gauntletLayer; // Movie (= Screen に投影するもの) とは、XML から取得した UI の構造と、ViewModel (表示するデータ) を合わせた概念です。 _gauntletMovie = _gauntletLayer.LoadMovie("ExampleUI.Window", _dataSource); // このレイヤーの描画領域に対して行われた入力のうち、受け取るものをビットフラグによって管理しています。 _gauntletLayer.InputRestrictions.SetInputRestrictions(true, InputUsageMask.MouseButtons); MapScreen.AddLayer(_gauntletLayer); } // MapScreen.OnFinalize() によって呼び出されます。 protected override void OnFinalize() { MapScreen.RemoveLayer(_gauntletLayer); _gauntletLayer.InputRestrictions.ResetInputRestrictions(); _gauntletLayer.ReleaseMovie(_gauntletMovie); _gauntletLayer = null; Layer = null; _dataSource.OnFinalize(); base.OnFinalize(); } // 毎ティック行う処理を記述します。 // // dt デルタタイム。前回のティックからの経過時間です。 protected override void OnFrameTick(float dt) { base.OnFrameTick(dt); if (MapScreen.Input.IsKeyPressed(InputKey.Home)) { _dataSource.IsVisible ^= true; // bool 反転 } } }} +SampleMissionView.cs SampleMapView とは使用するメソッドが違うだけで、やっていることは全く同じです。 using ExampleUI.ViewModels;using TaleWorlds.Engine.GauntletUI;using TaleWorlds.GauntletUI.Data;using TaleWorlds.InputSystem;using TaleWorlds.MountAndBlade.View.Missions; namespace ExampleUI.Views{ public class SampleMissionView MissionView { private TestWindowVM _dataSource; private GauntletLayer _gauntletLayer; private IGauntletMovie _gauntletMovie; public override void OnMissionScreenInitialize() { base.OnMissionScreenInitialize(); _dataSource = new TestWindowVM(); // localOrder (レイヤーの優先度) が小さいほど、他のレイヤーより下 (画面奥) に描画されます。 // // ESC メニュー (GauntletMissionEscapeMenu) のレイヤー優先度が 50 なので、 これよりは小さい // した方がよさそうです。あるいは、ESC メニュー表示中は GUI を非表示にする処理を追加しましょう。 _gauntletLayer = new GauntletLayer(40); // Movie (= Screen に投影するもの) とは、XML から取得した UI の構造と、ViewModel (表示するデータ) を合わせた概念です。 _gauntletMovie = _gauntletLayer.LoadMovie("ExampleUI.Window", _dataSource); // このレイヤーの描画領域に対して行われた入力のうち、受け取るものをビットフラグによって管理しています。 /* _gauntletLayer.InputRestrictions.SetInputRestrictions(true, InputUsageMask.MouseButtons); */ // Mission 中はマウスを視点移動や攻撃に使うため、ポインティングデバイスとして使うには、 // 戦闘結果画面において、Tab を押す - リザルトとマウスカーソル表示 - ボタンが押せるようになる // とやっているような感じで、キーボード操作を挟んで切り替える必要があります。 // 今回はそこまで実装していないため、Mission 中は閉じるボタンをクリックできません。 MissionScreen.AddLayer(_gauntletLayer); } // MissionScreen.OnEndMission() によって呼び出されます。 public override void OnMissionScreenFinalize() { MissionScreen.RemoveLayer(_gauntletLayer); _gauntletLayer.ReleaseMovie(_gauntletMovie); _gauntletLayer = null; _dataSource.OnFinalize(); base.OnMissionScreenFinalize(); } // 毎ティック行う処理を記述します。 // // dt デルタタイム。前回のティックからの経過時間です。 public override void OnMissionScreenTick(float dt) { base.OnMissionScreenTick(dt); if (Input.IsKeyPressed(InputKey.Home)) { _dataSource.IsVisible ^= true; // bool 反転 } } }} +TestWindowVM.cs ViewModel とは View を抽象化したものです。今回の例では、 画面左上にウィンドウを表示 ウィンドウの中には閉じるボタン1つだけ 閉じるボタンを押すとウィンドウが閉じる Home キーでも開いたり閉じたりできる というモデルで行きます。 TestWindowVM は View から完全に分離されているので、今回使う2つの View どちらにもそのまま使用できます。 using TaleWorlds.Core;using TaleWorlds.Library;// View-ViewModel の参照を一方向にするため using ExampleUI.Views をやっていません。 namespace ExampleUI.ViewModels{ // ViewModel は全て TaleWorlds.Library.ViewModel を継承して作ります。 // クラス名に VM を付けなければならないという決まりがあるわけではないのですが、 // 公式の ViewModel は全て VM を付けているようなので踏襲しています。 public class TestWindowVM ViewModel { private bool _isVisible; public TestWindowVM() { IsVisible = true; } // ViewModel のプロパティやメソッドは、View の LoadMovie で関連付けられた XML Prefab から参照できます。 // XML の方を見てもらえば、それらがどのように使われているか分かるかと思います。 [DataSourceProperty] public bool IsVisible { get = _isVisible; set { if (_isVisible != value) { _isVisible = value; // このメソッドを呼ぶことで、TestWindowVM にバインディングされた View に対して // TestWindowVM.IsVisible プロパティの変更通知が行き、プロパティを参照している // ウィジェットの方も状態が変化するという仕組みです。 OnPropertyChangedWithValue(value, "IsVisible"); } } } // こちらは値の変更がない固定ラベルなので、set アクセサーや OnPropertyChangedWithValue() は使っていません。 [DataSourceProperty] public string WindowTitle = "Test Window"; // 以前はラベルにも日本語が使えたのですが、1.6.0 から文字化けするようになってしまいました。 [DataSourceProperty] public string CloseButtonLabel = "Close"; // ButtonWidget のクリックイベントに応じて呼ばれるよう、ExampleUI.Window.xml に記述してあります。 public void OnCloseButtonClick() { IsVisible = false; InformationManager.DisplayMessage(new InformationMessage("ウィンドウを閉じました。\n再度開くには Home キーを押してください。")); } }} DataSourceProperty 属性 公式の ViewModel 派生クラスのプロパティにはこの属性を与えられたものが多く見受けられますが、ソースコードを見ても特に何か定義されているわけでもなく、実際、属性を付けても付けなくても動作は変わらないように見えます。唯一、ViewModel.Properties プロパティで DataSourceProperty のリストを作るのに使われているようですが、このプロパティは他からは特に参照されていないようです。一応、XML から参照されるプロパティには全てこの属性を付けてあります。 +ExampleUI.Window.xml ExampleUI で使うウィンドウの Prefab です。 Prefab Window Widget WidthSizePolicy="Fixed" HeightSizePolicy="Fixed" SuggestedWidth="400" SuggestedHeight="300" IsVisible="@IsVisible" Children Standard.Window Parameter.Title="@WindowTitle" Children Standard.PopupCloseButton Parameter.ButtonText="@CloseButtonLabel" Parameter.ButtonAction="OnCloseButtonClick" / /Children /Standard.Window /Children /Widget /Window /Prefab Widget TaleWorlds.GauntletUI.Widget クラスです。Widget クラスは基底クラスとしてデータを保持しているだけで、UI としての機能はありません。ここでは、他の UI をまとめるコンテナとして使っています。 SizePolicy Fixed 指定の幅にしますStretchToParent 親要素の幅に合わせますCoverChildren 子要素を全て表示できる幅にします IsVisible="@IsVisible" 名前が同じで分かりにくいですが、最初の方が Widget クラスのプロパティ、@付きの方がデータソースとなる ViewModel 派生クラス (今回の例で言えば TestWindowVM) のプロパティとなります。このように指定することで、TestWindowVM.IsVisible の中で呼んである ViewModel.OnPropertyChangedWithValue() によって発せられたイベントが Widget に届くようになり、TestWindowVM.IsVisible と Widget.IsVisible が連動するわけです。 Standard.Window と Standard.PopupCloseButton 公式の Prefab を使っています。公式の Prefab も大半は各シチュエーションに特化した大型のものばかりで、そのままでの再利用はしにくいですが、Native\GUI\Prefabs\Standard にあるものは比較的小型で汎用性が高くなっています。 Parameter Standard.Window 等の Prefab では Parameter が宣言されているものがあり、Widget のプロパティに値を渡すのと同じ感覚で、Prefab 自体に値を渡すことができます。Prefab 側では、自分の中の Widget に受け取った値を渡すよう記述されています。 結果 MapScreen MissionScreen 左上にウィンドウっぽいものが表示されています。Prefab を適当に選んだのでデザインがめちゃくちゃですが、画面上にとりあえず何かを表示する例ということで大目に見てください。 手順をおおまかにまとめると、 作りたい UI を考える その構想に沿った GUI の構造 (Prefab) と表示するデータ (ViewModel) を用意する 用意したものを、表示先がワールドマップなら MapView、戦闘などの Mission なら MissionView で LoadMovie() する View をスクリーンに追加する となります。 Opponent Health Bar 今度はもう少し実践的な MOD を作っていきます。見出しが示す通り、戦っている相手の HP バーを表示する MOD です。 イメージとしてはこんな感じ。 OpponentHealthBar プロジェクトSubModule.cs MissionOpponentHealthBar.cs OpponentHealthVM.cs OpponentHealthBar.xml OpponentHealthBar.xml は、 [Bannerlord インストールフォルダー]\Modules\OpponentHealthBar\GUI\Prefabs の中に保存します。 バージョン1 それでは、とりあえず簡単に文字で表示するところから始めてみます。 +SubModule.cs using System;using TaleWorlds.MountAndBlade;using TaleWorlds.MountAndBlade.View.Missions; namespace OpponentHealthBar{ public class SubModule MBSubModuleBase { public override void OnBeforeMissionBehaviourInitialize(Mission mission) { base.OnBeforeMissionBehaviourInitialize(mission); mission.AddMissionBehaviour( ViewCreatorManager.CreateMissionView MissionOpponentHealthBar (false, mission, Array.Empty object ())); } }} +MissionOpponentHealthBar.cs using TaleWorlds.Core;using TaleWorlds.Engine.GauntletUI;using TaleWorlds.GauntletUI.Data;using TaleWorlds.MountAndBlade;using TaleWorlds.MountAndBlade.View.Missions; namespace OpponentHealthBar{ public class MissionOpponentHealthBar MissionView { private OpponentHealthVM _dataSource; private GauntletLayer _gauntletLayer; private IGauntletMovie _gauntletMovie; public MissionOpponentHealthBar() { ViewOrderPriorty = 20; } public override void OnMissionScreenInitialize() { base.OnMissionScreenInitialize(); _dataSource = new OpponentHealthVM(); _gauntletLayer = new GauntletLayer(ViewOrderPriorty); _gauntletMovie = _gauntletLayer.LoadMovie("OpponentHealthBar", _dataSource); MissionScreen.AddLayer(_gauntletLayer); } public override void OnMissionScreenFinalize() { MissionScreen.RemoveLayer(_gauntletLayer); _gauntletLayer.ReleaseMovie(_gauntletMovie); _gauntletLayer = null; _dataSource.OnFinalize(); base.OnMissionScreenFinalize(); } // 画面中央 (マウスカーソルの位置) と、一番手前にある IFocusable なオブジェクトとが交差した瞬間に呼ばれます。 // // agent フォーカスした Agent。シングルプレイだと、おそらく常に Agent.Main (プレイヤーキャラクター) です。 // focusableObject フォーカスされたもの // isInteractable Talk や Use などのインタラクトが可能か // // フォーカスが 10m までしか利かないのは MissionMainAgentInteractionComponent.FocusTick() で // 決められた仕様なのでどうしようもありません。 public override void OnFocusGained(Agent agent, IFocusable focusableObject, bool isInteractable) { base.OnFocusGained(agent, focusableObject, isInteractable); _dataSource.OnFocusChanged(focusableObject); } // 今までフォーカスされていた IFocusable なオブジェクトから、フォーカスが外れた瞬間に呼ばれます。 // // agent フォーカスしていた Agent。シングルプレイだと、おそらく常に Agent.Main (プレイヤーキャラクター) です。 // focusableObject フォーカスされていたもの public override void OnFocusLost(Agent agent, IFocusable focusableObject) { base.OnFocusLost(agent, focusableObject); _dataSource.OnFocusChanged(focusableObject); } // Agent が何らかの攻撃を受けた際に呼ばれます。 // // affectedAgent 攻撃を受けた Agent // affectorAgent 攻撃を行った Agent // damage ダメージ量 // affectorWeapon 使用された武器 public override void OnAgentHit(Agent affectedAgent, Agent affectorAgent, int damage, in MissionWeapon affectorWeapon) { base.OnAgentHit(affectedAgent, affectorAgent, damage, affectorWeapon); _dataSource.OnAgentHit(affectedAgent); } // Agent が戦闘不能になった際に呼ばれます。 // // affectedAgent 攻撃を受けた Agent // affectorAgent 攻撃を行った Agent // agentState Agent の状態 // blow とどめの一撃の内容 // // 似たようなメソッドに OnAgentDeleted がありますが、そちらは // 戦闘不能になって倒れている Agent が時間経過や表示限界により消滅する際に呼ばれるようです。 public override void OnAgentRemoved(Agent affectedAgent, Agent affectorAgent, AgentState agentState, KillingBlow blow) { base.OnAgentRemoved(affectedAgent, affectorAgent, agentState, blow); _dataSource.OnAgentRemoved(affectedAgent); } }} +OpponentHealthVM.cs 今度のモデルは、 Agent (Mission 中に動きうるもの) の HP 現在値/最大値 を文字で表示する Agent にフォーカスが合うと表示、フォーカスが外れると非表示 とします。 using System;using TaleWorlds.Library;using TaleWorlds.MountAndBlade; namespace OpponentHealthBar{ public class OpponentHealthVM ViewModel { private Agent _opponent; private string _strValues; private bool _isVisible; private const string ValueFormat = "{0} / {1}"; public OpponentHealthVM() { _opponent = null; _strValues = string.Empty; _isVisible = false; } [DataSourceProperty] public string StrValues { get = _strValues; private set { if (_strValues != value) { _strValues = value; OnPropertyChangedWithValue(value, "StrValues"); } } } [DataSourceProperty] public bool IsVisible { get = _isVisible; set { if (_isVisible != value) { _isVisible = value; OnPropertyChangedWithValue(value, "IsVisible"); } } } // GUI に表示するデータの更新はこのメソッドで行います。 // ただし、ここに記述すればあとは勝手に更新されていくというものではないので、 // 自分が必要な場所では自分で呼び出さなければなりません。 public override void RefreshValues() { base.RefreshValues(); int currentValue = (int)Math.Ceiling(_opponent?.Health ?? 0f); int maxValue = (int)Math.Ceiling(_opponent?.HealthLimit ?? 0f); StrValues = string.Format(ValueFormat, currentValue, maxValue); IsVisible = _opponent != null; } public void OnFocusChanged(IFocusable focusableObject) { if (focusableObject is Agent possibleOpponent) { _opponent = (_opponent == null || _opponent != possibleOpponent) ? possibleOpponent null; RefreshValues(); } } public void OnAgentHit(Agent affectedAgent) { if (_opponent == affectedAgent) { RefreshValues(); } } public void OnAgentRemoved(Agent removedAgent) { if (_opponent == removedAgent) { // 先にフォーカスロストが発生してここには入らないかも。 OnFocusChanged(removedAgent); } } }} +OpponentHealthBar.xml Prefab Window Widget WidthSizePolicy="Fixed" HeightSizePolicy="Fixed" SuggestedWidth="430" SuggestedHeight="50" HorizontalAlignment="Center" VerticalAlignment="Top" MarginTop="250" IsVisible="@IsVisible" Children TextWidget Text="@StrValues" WidthSizePolicy="CoverChildren" HeightSizePolicy="CoverChildren" HorizontalAlignment="Center" VerticalAlignment="Center" Brush="Tooltip.Text" Brush.FontSize="24" / /Children /Widget /Window /Prefab Alignment 親要素の領域内のどちら側に寄せるかです。親要素より幅が小さい場合にしか効果がありません。この例の TextWidget で言うと、親要素は幅 430、自身は CoverChildren、つまり StrValues が入りきるだけの幅なので機能していますが、これを StretchToParent とかにすると、左寄せや右寄せが機能しなくなります。 Margin Left, Top, Right, Bottom のマージンです。幅+マージンが要素の実際の幅になります。 以上を実行した状態が下の画像です。 ちょっと見にくいですが、画面上部中央に相手の HP 100/100 が表示されていますね。フォーカスを外せば数字は消えます。しかし、今のところ町人だろうが馬だろうが Agent なら何にでも表示されてしまいますので、そこは改良が必要です。 バージョン2 次はバーの導入とその他の改良を行っていきたいと思います。 バー表示に使うのは FillBarWidget です。ソースコードや、FillBarWidget を使用している公式の Prefab を見てみると、FillBarWidget.MaxAmount プロパティと FillBarWidget.InitialAmmount プロパティに値を渡せばとりあえず動きそうです。よって、ViewModel 側でその値を用意してやる必要があります。 +OpponentHealthVM.cs [DataSourceProperty] public int CurrentValue { get = _currentValue; private set { if (_currentValue != value) { _currentValue = value; OnPropertyChangedWithValue(value, "CurrentValue"); } } } [DataSourceProperty] public int MaxValue { get = _maxValue; private set { if (_maxValue != value) { _maxValue = value; OnPropertyChangedWithValue(value, "MaxValue"); } } } // GUI に表示するデータの更新はこのメソッドで行います。 // ただし、ここに記述すればあとは勝手に更新されていくというものではないので、 // 自分が必要な場所では自分で呼び出さなければなりません。 public override void RefreshValues() { base.RefreshValues(); // 元々ローカル変数だったものを、View から参照できるようにプロパティに昇格しました。 CurrentValue = (int)Math.Ceiling(_opponent?.Health ?? 0f); MaxValue = (int)Math.Ceiling(_opponent?.HealthLimit ?? 0f); StrValues = string.Format(ValueFormat, CurrentValue, MaxValue); IsVisible = _opponent != null; } public void OnFocusChanged(IFocusable focusableObject) { // 適切な相手に表示されるよう条件を追加しました。 if (focusableObject is Agent possibleOpponent possibleOpponent.IsHuman possibleOpponent.IsEnemyOf(Agent.Main)) { _opponent = (_opponent == null || _opponent != possibleOpponent) ? possibleOpponent null; RefreshValues(); } } ViewModel にプロパティを追加したので、今度は Prefab を通じてそれらを FillBarWidget に渡します。 +OpponentHealthBar.xml Prefab Window FillBarWidget WidthSizePolicy="Fixed" HeightSizePolicy="Fixed" SuggestedWidth="430" SuggestedHeight="50" HorizontalAlignment="Center" VerticalAlignment="Top" MarginTop="250" ContainerWidget="FillBarContainer" FillWidget="FillVisualParent\FillVisual" MaxAmount="@MaxValue" InitialAmount="@CurrentValue" IsVisible="@IsVisible" Children Widget Id="FillVisualParent" WidthSizePolicy="Fixed" HeightSizePolicy="StretchToParent" SuggestedWidth="400" HorizontalAlignment="Center" VerticalAlignment="Center" MarginTop="10" MarginBottom="10" Sprite="BlankWhiteSquare" Color="#202020A0" Children BrushWidget Id="FillVisual" WidthSizePolicy="Fixed" HeightSizePolicy="StretchToParent" SuggestedWidth="400" HorizontalAlignment="Left" Brush="Mission.MainAgentHUD.HeroHealthBar.Fill" / /Children /Widget Widget Id="FillBarContainer" WidthSizePolicy="StretchToParent" HeightSizePolicy="StretchToParent" Sprite="options_memory_progress_frame" / TextWidget Text="@StrValues" WidthSizePolicy="CoverChildren" HeightSizePolicy="CoverChildren" HorizontalAlignment="Center" VerticalAlignment="Center" PositionYOffset="3" Brush="Tooltip.Text" Brush.FontSize="24" / /Children /FillBarWidget /Window /Prefab FillBarWidget バージョン1ではただの Widget だったトップレベルのウィジェットを FillBarWidget に変更してあります (3行目)。 FillVisual 赤ゲージの Brush を保持した BrushWidget の ID です (9行目)。このように、Widget には任意の ID がつけられます。それによって、他のウィジェットを操作するタイプのウィジェットに対し、操作対象がどれなのか伝えることができます。 ここでは、FillBarWidget.FillWidget プロパティに渡して、FillBarWidget が "FillVisual" の幅を操作できるようにしています。 親要素の "FillVisualParent" はゲージが減った部分を埋める背景画像です。"BlankWhiteSquare" という無地画像を、暗い半透明に着色・透過させて使っています。 FillBarContainer 14行目にある、スプライト画像を保持した Widget の ID です。これを FillBarWidget.ContainerWidget プロパティに渡してバーの枠としています。 ところで、Mission 用の GUI はそのままだとフォトモード中でも表示されてしまいます。構図を決めている間に GUI が表示されてしまうのは邪魔ですから、MissionView を使うときは、フォトモード中 GUI を非表示にする処理を追加しておきましょう。 +MissionOpponentHealthBar.cs // フォトモードで構図を決めている最中に GUI が表示されないようにするための処理です。 // この処理を入れても入れなくても、どちらにしろ出力される画像ファイルに GUI は写りません。 public override void OnPhotoModeActivated() { base.OnPhotoModeActivated(); _gauntletLayer._gauntletUIContext.ContextAlpha = 0f; } public override void OnPhotoModeDeactivated() { base.OnPhotoModeDeactivated(); _gauntletLayer._gauntletUIContext.ContextAlpha = 1f; } 結果 攻撃前 攻撃後 どうでしょう、一応 HP バーらしくなったのではないでしょうか。 他にも、与えたダメージ分のバーをスライドさせる視覚効果とか、フォーカスが外れてからバーが消えるまでに時間差を設けるとか、改良はいろいろ考えられますが、サンプルではここまでです。興味があったら自分の MOD として実装してみてください。 +コード最終形 SubModule.cs using System;using TaleWorlds.MountAndBlade;using TaleWorlds.MountAndBlade.View.Missions; namespace OpponentHealthBar{ public class SubModule MBSubModuleBase { public override void OnBeforeMissionBehaviourInitialize(Mission mission) { base.OnBeforeMissionBehaviourInitialize(mission); mission.AddMissionBehaviour( ViewCreatorManager.CreateMissionView MissionOpponentHealthBar (false, mission, Array.Empty object ())); } }} MissionOpponentHealthBar.cs using TaleWorlds.Core;using TaleWorlds.Engine.GauntletUI;using TaleWorlds.GauntletUI.Data;using TaleWorlds.MountAndBlade;using TaleWorlds.MountAndBlade.View.Missions; namespace OpponentHealthBar{ public class MissionOpponentHealthBar MissionView { private OpponentHealthVM _dataSource; private GauntletLayer _gauntletLayer; private IGauntletMovie _gauntletMovie; public MissionOpponentHealthBar() { ViewOrderPriorty = 20; } public override void OnMissionScreenInitialize() { base.OnMissionScreenInitialize(); _dataSource = new OpponentHealthVM(); _gauntletLayer = new GauntletLayer(ViewOrderPriorty); _gauntletMovie = _gauntletLayer.LoadMovie("OpponentHealthBar", _dataSource); MissionScreen.AddLayer(_gauntletLayer); } public override void OnMissionScreenFinalize() { MissionScreen.RemoveLayer(_gauntletLayer); _gauntletLayer.ReleaseMovie(_gauntletMovie); _gauntletLayer = null; _dataSource.OnFinalize(); base.OnMissionScreenFinalize(); } // 画面中央 (マウスカーソルの位置) と、一番手前にある IFocusable なオブジェクトとが交差した瞬間に呼ばれます。 // // agent フォーカスした Agent。シングルプレイだと、おそらく常に Agent.Main (プレイヤーキャラクター) です。 // focusableObject フォーカスされたもの // isInteractable Talk や Use などのインタラクトが可能か // // フォーカスが 10m までしか利かないのは MissionMainAgentInteractionComponent.FocusTick() で // 決められた仕様なのでどうしようもありません。 public override void OnFocusGained(Agent agent, IFocusable focusableObject, bool isInteractable) { base.OnFocusGained(agent, focusableObject, isInteractable); _dataSource.OnFocusChanged(focusableObject); } // 今までフォーカスされていた IFocusable なオブジェクトから、フォーカスが外れた瞬間に呼ばれます。 // // agent フォーカスしていた Agent。シングルプレイだと、おそらく常に Agent.Main (プレイヤーキャラクター) です。 // focusableObject フォーカスされていたもの public override void OnFocusLost(Agent agent, IFocusable focusableObject) { base.OnFocusLost(agent, focusableObject); _dataSource.OnFocusChanged(focusableObject); } // Agent が何らかの攻撃を受けた際に呼ばれます。 // // affectedAgent 攻撃を受けた Agent // affectorAgent 攻撃を行った Agent // damage ダメージ量 // affectorWeapon 使用された武器 public override void OnAgentHit(Agent affectedAgent, Agent affectorAgent, int damage, in MissionWeapon affectorWeapon) { base.OnAgentHit(affectedAgent, affectorAgent, damage, affectorWeapon); _dataSource.OnAgentHit(affectedAgent); } // Agent が戦闘不能になった際に呼ばれます。 // // affectedAgent 攻撃を受けた Agent // affectorAgent 攻撃を行った Agent // agentState Agent の状態 // blow とどめの一撃の内容 // // 似たようなメソッドに OnAgentDeleted がありますが、そちらは // 戦闘不能になって倒れている Agent が時間経過や表示限界により消滅する際に呼ばれるようです。 public override void OnAgentRemoved(Agent affectedAgent, Agent affectorAgent, AgentState agentState, KillingBlow blow) { base.OnAgentRemoved(affectedAgent, affectorAgent, agentState, blow); _dataSource.OnAgentRemoved(affectedAgent); } // フォトモードで構図を決めている最中に GUI が表示されないようにするための処理です。 // この処理を入れても入れなくても、どちらにしろ出力される画像ファイルに GUI は写りません。 public override void OnPhotoModeActivated() { base.OnPhotoModeActivated(); _gauntletLayer._gauntletUIContext.ContextAlpha = 0f; } public override void OnPhotoModeDeactivated() { base.OnPhotoModeDeactivated(); _gauntletLayer._gauntletUIContext.ContextAlpha = 1f; } }} OpponentHealthVM.cs using System;using TaleWorlds.Library;using TaleWorlds.MountAndBlade; namespace OpponentHealthBar{ public class OpponentHealthVM ViewModel { private Agent _opponent; private int _currentValue; private int _maxValue; private string _strValues; private bool _isVisible; private const string ValueFormat = "{0} / {1}"; public OpponentHealthVM() { _opponent = null; _strValues = string.Empty; _isVisible = false; } [DataSourceProperty] public int CurrentValue { get = _currentValue; private set { if (_currentValue != value) { _currentValue = value; OnPropertyChangedWithValue(value, "CurrentValue"); } } } [DataSourceProperty] public int MaxValue { get = _maxValue; private set { if (_maxValue != value) { _maxValue = value; OnPropertyChangedWithValue(value, "MaxValue"); } } } [DataSourceProperty] public string StrValues { get = _strValues; private set { if (_strValues != value) { _strValues = value; OnPropertyChangedWithValue(value, "StrValues"); } } } [DataSourceProperty] public bool IsVisible { get = _isVisible; set { if (_isVisible != value) { _isVisible = value; OnPropertyChangedWithValue(value, "IsVisible"); } } } // GUI に表示するデータの更新はこのメソッドで行います。 // ただし、ここに記述すればあとは勝手に更新されていくというものではないので、 // 自分が必要な場所では自分で呼び出さなければなりません。 public override void RefreshValues() { base.RefreshValues(); // 元々ローカル変数だったものを、View から参照できるようにプロパティに昇格しました。 CurrentValue = (int)Math.Ceiling(_opponent?.Health ?? 0f); MaxValue = (int)Math.Ceiling(_opponent?.HealthLimit ?? 0f); StrValues = string.Format(ValueFormat, CurrentValue, MaxValue); IsVisible = _opponent != null; } public void OnFocusChanged(IFocusable focusableObject) { // 適切な相手に表示されるよう条件を追加しました。 if (focusableObject is Agent possibleOpponent possibleOpponent.IsHuman possibleOpponent.IsEnemyOf(Agent.Main)) { _opponent = (_opponent == null || _opponent != possibleOpponent) ? possibleOpponent null; RefreshValues(); } } public void OnAgentHit(Agent affectedAgent) { if (_opponent == affectedAgent) { RefreshValues(); } } public void OnAgentRemoved(Agent removedAgent) { if (_opponent == removedAgent) { // 先にフォーカスロストが発生してここには入らないかも。 OnFocusChanged(removedAgent); } } }} OpponentHealthBar.xml Prefab Window FillBarWidget WidthSizePolicy="Fixed" HeightSizePolicy="Fixed" SuggestedWidth="430" SuggestedHeight="50" HorizontalAlignment="Center" VerticalAlignment="Top" MarginTop="250" ContainerWidget="FillBarContainer" FillWidget="FillVisualParent\FillVisual" MaxAmount="@MaxValue" InitialAmount="@CurrentValue" IsVisible="@IsVisible" Children Widget Id="FillVisualParent" WidthSizePolicy="Fixed" HeightSizePolicy="StretchToParent" SuggestedWidth="400" HorizontalAlignment="Center" VerticalAlignment="Center" MarginTop="10" MarginBottom="10" Sprite="BlankWhiteSquare" Color="#202020A0" Children BrushWidget Id="FillVisual" WidthSizePolicy="Fixed" HeightSizePolicy="StretchToParent" SuggestedWidth="400" HorizontalAlignment="Left" Brush="Mission.MainAgentHUD.HeroHealthBar.Fill" / /Children /Widget Widget Id="FillBarContainer" WidthSizePolicy="StretchToParent" HeightSizePolicy="StretchToParent" Sprite="options_memory_progress_frame" / TextWidget Text="@StrValues" WidthSizePolicy="CoverChildren" HeightSizePolicy="CoverChildren" HorizontalAlignment="Center" VerticalAlignment="Center" PositionYOffset="3" Brush="Tooltip.Text" Brush.FontSize="24" / /Children /FillBarWidget /Window /Prefab 名前
https://w.atwiki.jp/bannerlord/pages/50.html
BannerlordはSteamWorkshopに対応しているが、バージョン差分が作れないこともありNexus Modsのほうが盛んに開発・更新が行われている。 古いMODでもたまたま最新バージョンで動作したりするが、基本的には最新バージョンに対応しているものを使うか、ゲーム本体をバージョンダウンしたほうが無難。 また現行のセーブファイルにいきなりMODを導入しようとするとほとんどの場合エラーになってしまうため、MODを導入したら新規データで始めることを推奨する。 MODによるトラブルの相談は専用のスレを使ったほうが流れにくく、回答してもらいやすい(はず)。 【MOD総合】Mount Blade2 【Bannerlord】 5馬力 https //egg.5ch.net/test/read.cgi/game/1697148115/l50 (導入方法) 1.https //www.nexusmods.com/へ行って会員登録をしましょう、メアドと12桁のパスワードが必要なのでそれを事前に用意しておくことが必要です(事実上ここしかMod配布サイトがないため必要になります) 登録過程で有料会員について色々プッシュしてきますけどまずは無料会員で充分なので全部無視して大丈夫です 2.無事会員登録を済ませたらhttps //www.nexusmods.com/mountandblade2bannerlordにいってどんなModがあるか探してみましょう、初心者には直近2週間で最も"いいね"を獲得したTop30のModのリスト(https //www.nexusmods.com/mountandblade2bannerlord/mods/top/)があるのでそのリストを見て適当に興味のあるModを探すことをお勧めします 3.ここでは例として有名なBannerlord Tweaks(https //www.nexusmods.com/mountandblade2bannerlord/mods/49)のページに行ってみます 普通ページに行くとDESCRIPTIONのタブが自動的に選択されているはずです ここではModの作者の方がこれは何をするModなのかを説明してくれています、英語なので適当に理解するだけでまずはOKです、ただしこのページではトラブルが起きたときの対処方法も説明されていることが多いので導入後トラブルが起きたときはまずはこのDESCRIPTIONのタブを読みに帰ってくる癖をつけておきましょう 4.DESCRIPTIONをみてどんなModか大体理解したらFILESのタブを選択します そうするとダウンロードできるファイルが表示されます ダウンロードマネージャーを使ってインストールするのが左のボタン、手動インストールが右のボタン。 バージョン管理の面で圧倒的にダウンロードマネージャのほうが便利なためそちらを推奨。 5.そうするとAdditional files requiredの画面が現れます、これはこのModを動かすには他のModも必要な時にそのリンクを示してくれています(そういうのが無いModの場合はこの画面は現れず次の6.の画面になります)、そのリンクをブラウザの異なるタブで開いておいて後でそのModもダウンロードしておきましょう 6.画面が変わりダウンロード画面になります、無料会員なので左のSLOW DOWNLOADをクリック、すると何秒か後にダウンロードが始まります 7.ダウンロードされたファイルは自動で解凍されModulesのフォルダーに格納され、次回起動時以降ランチャーから有効化できます。 8.エラーが起きる場合は起動順を変えたり、.dllファイルが読み込み専用になっていないか確認しましょう。 (簡単なトラブル対処方法) 1.ほとんどのModのDESCRIPTIONでいわれていますが、Windows 10ではデフォルトでOSが出所不明だと考えるdllが動かないようになっているのでその制約を外すことが必要です(Windows 7では不要) \Steam\steamapps\common\Mount Blade II Bannerlord\Modules\(Modフォルダ)\bin\Win64_Shipping_Client に行って(Mod).dllを右クリック、プロパティに行ってアンブロックを押してください これでModが動くようになるはずです 2.いくつかModを導入していくとゲームが起動しなくなる場合があります、これはMod自体というよりM Bの本体の問題であり、全く同じModファイルでも起動順を入れ替えるだけで起動したりしなかったりします 3.エラーの原因がわかりにくい場合、原因をたどるための補助MODもあります https //www.nexusmods.com/mountandblade2bannerlord/mods/5301